/*
 * Copyright 2010 www.wojilu.com
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

using System;
using System.Data;
using wojilu;
using wojilu.Data;
using wojilu.Log;

namespace wojilu.ORM.Operation
{

    internal class CountOperation
    {

        private static readonly ILog logger = LogManager.GetLogger(typeof(CountOperation));

        public static int Count(Type t)
        {
            return Count(t, "");
        }

        public static int Count(Type t, String condition)
        {
            return Count(condition, Entity.GetInfo(t));
        }

        private static int Count(String condition, EntityInfo entityInfo)
        {
            String countSql;
            int result = 0;
            SqlBuilder builder = new SqlBuilder(entityInfo);
            if (strUtil.IsNullOrEmpty(condition))
            {
                countSql = String.Format("select count(*) from {0}", entityInfo.TableName);
            }
            else
            {
                countSql = builder.GetCountSql(condition);
            }
            logger.Info(LoggerUtil.SqlPrefix + "[Count(String condition) Sql]:" + countSql);
            IDbCommand command = DataFactory.GetCommand(countSql, DbContext.getConnection(entityInfo));
            try
            {
                result = cvt.ToInt(command.ExecuteScalar());
            }
            catch (Exception exception)
            {
                logger.Error(exception.Message);
                throw exception;
            }

            return result;
        }


    }
}

